#pragma once
#include"noncopyable.h"
// 派生类，最好不要引用底层的头文件
#include<vector>
#include<unordered_map>
#include"Timestamp.h"
#include"Channel.h"
class EventLoop;
class Channel;
// muduo库中多路事件分发器的核心IO复用模块
class Poller: noncopyable
{
public:
using ChannelList = std::vector<Channel*>; 
Poller(EventLoop* loop);
virtual ~Poller() = default;
// 保留统一的给所有IO复用的接口
virtual Timestamp poll(int timeoutMs,ChannelList* activeChannels) = 0;

virtual void updateChannel(Channel* channel) = 0;

virtual void removeChannel(Channel* channel) = 0;

// 判断是否有某个Channel在当前Poller当中
bool hasChannel(Channel* channel) const;

// 默认IO复用的处理 EventLoop 可以通过该接口获取默认的IO复用的具体实现
static Poller* newDefaultPoller(EventLoop* loop);// 注意这里的操作，在DefaultPoller.cc实现


protected:
// map 的key : sockfd value: sockfd所属的Channel 的通道类型
using ChannelMap = std::unordered_map<int,Channel*>;
ChannelMap channels_; // map 结构的哈希表，通过fd能够找到Channel*
private:
EventLoop* ownerLoop_; // 定义Poller所属的事件循环EventLoop
};